{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 5: Equation solving"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Robert Johansson\n",
    "\n",
    "Source code listings for [Numerical Python - Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib](https://www.apress.com/us/book/9781484242452) (ISBN 978-1-484242-45-2)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib\n",
    "matplotlib.rcParams['mathtext.fontset'] = 'stix'\n",
    "matplotlib.rcParams['font.family'] = 'serif'\n",
    "matplotlib.rcParams['font.sans-serif'] = 'stix'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from scipy import linalg as la"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from scipy import optimize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import sympy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "sympy.init_printing()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "#import matplotlib as mpl\n",
    "#mpl.rcParams[\"font.family\"] = \"serif\"\n",
    "#mpl.rcParams[\"font.size\"] = \"12\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from __future__ import division"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear Algebra - Linear Equation Systems"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "2 x_1 + 3 x_2 = 4\n",
    "$$\n",
    "\n",
    "$$\n",
    "5 x_1 + 4 x_2 = 3\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "\n",
    "x1 = np.linspace(-4, 2, 100)\n",
    "\n",
    "x2_1 = (4 - 2 * x1)/3\n",
    "x2_2 = (3 - 5 * x1)/4\n",
    "\n",
    "ax.plot(x1, x2_1, 'r', lw=2, label=r\"$2x_1+3x_2-4=0$\")\n",
    "ax.plot(x1, x2_2, 'b', lw=2, label=r\"$5x_1+4x_2-3=0$\")\n",
    "\n",
    "A = np.array([[2, 3], [5, 4]])\n",
    "b = np.array([4, 3])\n",
    "x = la.solve(A, b)\n",
    "\n",
    "ax.plot(x[0], x[1], 'ko', lw=2)\n",
    "ax.annotate(\"The intersection point of\\nthe two lines is the solution\\nto the equation system\",\n",
    "            xy=(x[0], x[1]), xycoords='data',\n",
    "            xytext=(-120, -75), textcoords='offset points', \n",
    "            arrowprops=dict(arrowstyle=\"->\", connectionstyle=\"arc3, rad=-.3\"))\n",
    "\n",
    "ax.set_xlabel(r\"$x_1$\", fontsize=18)\n",
    "ax.set_ylabel(r\"$x_2$\", fontsize=18)\n",
    "ax.legend();\n",
    "\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-linear-systems-simple.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Symbolic approach"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "A = sympy.Matrix([[2, 3], [5, 4]])\n",
    "b = sympy.Matrix([4, 3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABHNCSVQICAgIfAhkiAAAAMJJREFUKJHF0bFKgmEUxvFfUoZtQkMX4dTmICLiEkR3IA3dhOjQ5CLOQUNDeBEO4uQVJBW0hWtLtCgOOvh+8iF++EKDDxyel4f/ec+Bwz91jzfM8Y1nXGbBD5jiEV28Y4UvXOzCBYxwnsrOMAlNzSTMBS+jjUWqYYmn8L5KwtPg44w1f4N/7E7IUgkzDA9w2+mfuImBoYVOLHyHfixcRy8Wrmb8XEQNTlJhBa94sTlWojxu0cBPEl7jL4D7ahC74hG0Bv6aI/I8F0d9AAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle 2$"
      ],
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.rank()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFsAAAA7CAYAAAAUwvbDAAAABHNCSVQICAgIfAhkiAAABJRJREFUeJztmluoVUUYx3/7HBFFMUWwDh6xEFMjKkFT1FQqu8gRgx6KIDwGRaH4EoGYgQ+9SAVFD4kPRlARPVR2sYeIDr0EEUkYXTZUEoUUQWWF0eXowzc7Zs2eWWvNOmtmr3WaH2zOnpm1Zv7znZlvXfYfEtHoVDxvFnCuTiEJN/uBTYMW8X/hODA0aBFto0rAFgE/AZM1a5n2VAn2GPBW3UISdl4C5g5aRBvxXdmzgGHg9wBaNgPnI34azxhwf6C+XwUWBOq7Efiu7B3AGwF0jCK75ecAfTcGn2B3gBHg+wA67gGedbTNBuYHGDM6PsFeC3xkqb8BOAX8BrwDLPXU0AG2AO9ZtI0DXWCNVr8Y+Jf+HLxKtS8BngHuBZ4DrvTU48I1zyI9lXgUWG3UXQI8D1wF3Ax8A7zr2e824KCl/mLgMkT4jVr9HnXOpeqzAvhMtXWAj4GbVPkKpWmGpyaTvHnm6cnlOuCEo+1NS91dwEVaeRz4s8xAGi8gq8OFGewRo3078KT6vk2NP1Nr7wK3l9AxgQTLRt488/Rk0NPItcADwK3AMuO4pcBpy/kvAr9q5R+Aby3HLcCeshYiOdnnOnDGKN8GvK6+bwS+Bv7S2rvA9R7928ibZ56eDHoAPkT+g18CO43jdlLuLmQ1ki911gOfIqvO5G5ke1alg+zG91V5hGxQAH5B7nbqxDZPm54MttV2nP5gb6X/AmYyB7gaeFqruxxZbZPAbss5Y0ztVnI9cBL4R5X/Vh+dIep9aWabp0tPIRvUwQtVeR6SV4s4hFzUbIwjOU5/aFkHPFaiXzNn6xwG7tTKDwOfGMecAI44NOU9YZ52jHkI9zxNPYUMITlplyrfgWz3PO4DlmvlmUb7HOSWaa9WdxRYWUJPXrBPkb1wbQDOkl3JXyFzKGIC9wWyR9E8TT0ZbNtrEtnavVSynfy3fLuQX22GkeBtQXK/zh/Ay8jDC0jwR4Evcvp16euxClkUeo7+ALlwbVXllchLM9udlC9F87TpKcUO5PF5LvLOwsUtSMoxt+AKy7GbVNs1SP625XCdRcABdc4x+h8S9gP7LOctQx5m9qi/awvG6TGBe2WXmadLTyGzkdX4OPBglQ4cdIGngLeR1d0kJihOI8F4DflvLi860IMDyI45WmOf04LdwOc19zmKvEdYV3O/rWA4p+074Ef6b6WmwlnkIeOVGvtMJBKJRKJ2el6/VvzanEgkmkiyDLeAZBmOSLIMVyBZhiOSLMMNJ1mGK9Iky3BsYlqUKxHSMhyb6BblpliGYzMQi3JTLMOxGYhFOaRlOIiVNme8srTCouxrGa5spc1hWlmU67QMl7bSetBqi3JIy3BpK60HrbYox7AMQ4GVdgq0yqIc2jLcw9tKW4LWWZRdwd5I1jJ8juxWsfEQ4nWzBdSVQpYgL7Vcn2Oe43WBJ4BH1JimRfkk/cHxwZzHGfpdq/PxSFMhLMO5VtoKtNKiHMMyXNlKW3E8aJlFuU7LcGUrbcXxejTdovwfoSzDsWmyRTlDCMtwbFpjUQ5hGY5NoyzKsS3DsUkW5UQiMZ24AJLBsBR0JECMAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{2 \\sqrt{170} + 27}}{\\sqrt{27 - 2 \\sqrt{170}}}$"
      ],
      "text/plain": [
       "  _____________\n",
       "╲╱ 2⋅√170 + 27 \n",
       "───────────────\n",
       "  _____________\n",
       "╲╱ 27 - 2⋅√170 "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.condition_number()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJsAAAASCAYAAABM3qycAAAABHNCSVQICAgIfAhkiAAABTRJREFUaIHt2XnsHVMUB/BPf/1VK1UNSlCqImgQe9AKqiT21JKgoRQlliYilFia1BISW5AQUUoaGmpv1BakYg9ijdgSsSSoWlqxlCp/nHk6v+ncmXntr63I+yaT9+bcc8+9Z7n3nnuGDjr4n6Avtl/dk1gBDFjdE1jFaFffOv/2kNeV+38L/k483zUc/PlCv8XYscAzBjNwZTbmHOxRImsC3sXv+By3YUjN+P3wRta3iGG4E5fjJszCZgk5g3AhvqwYa2/MxQJ8gzuwboFneW1apUdTvt7Wl2b+TcrrzjUehGswr9DxBLxaMwkYhTVwXY72G+7LvR8mAm3r3Dh74xnshE8y2kScjQczmWNxKkYL5X5NzGEqdimhb4ZXcBHuymin42Xsiq9zvKOz53ysmRhnDC4Q9pqf6XWxCLYjMp4VsWlKj6Z8va0vzfzbSN5JiUl3ixW4f8UkWpiNbWp4HsXrJfT5IrhkE3wG/XPt/fCiWE0nJGTviYcyngkl436FPjlaX2H0uxPyXspkFdEHV2X983gOC3Pvy2vTKj2a8vWmvi008W878pbBQcIw3TV8O4jj7hGchy0TfPeLXWlojjYQi3BM9j4Gu5f0PU5M/vyStkF4DCMsa/yNsUTsqEXMxB9Yr6RtrnJjdSlfsQ+LBVGHKptW6dGUr7f1pbl/K+V1lfP9i2PF6llcw3eIMOBYcWx8jNv13J1gunDUE2Kr75PxP4YHMp7n8FrJGAuy3w9K2q7FFGGQIkZm43xU0vah2DVHlbSlsEQcH3kMw3D1ORbVNq3Soylfb+tLc/9WoirY+mfC728g50psKhL4SfgWp1iaL7TwRNa+Ld4XW+2rOAp/1YyxnUg4nyzQj8RneCvRb1j2O7+krZWkb1EzdgpdYu4vCAekcskWqmxap0dTvpWhb1P/VqIq2A7Gn2I7bIrvcbMIprfFKt6twHMzpoljZCTOstRAKXTjRJHk5neEjTAeV1f0bR15f5S0Lcp+16oZP4XTRO71J44WC2dQBX/Kpk30aMq3MvVt4t8kqoKt6RGamtTE7H8+/+oWR+mvIsBmicm+rGceV8Rk3IPHC/QbcY442lJorfB+JW0t2i8V/atwK87AVqLMsSlOruBP2bSJHk35Vqa+LaT8W4lUsA3EoZodoSm8iR/1LOxdKEod54kt/RiR8A8VOUgZxort+4oCfRKeFTWuAdnTyiH6Ze/dll7zy5LiVt3u0yYKVWCJKIUsFoFXhpRNm+rxX9KXcv8uF8aJYChe79tBH/yMw3O0d3BvCe9beK+Evp9ISMswV7pg2nqmYn2RD04vkTFDBEixGJuX3w7midpWGVI2bY1Tp0dTvlWlb5l/K+WlShqt7T6VtA/DFzWTGS1ukE/laIuwQQnvp5Y9RvcROc65Bfo6orB7JtYutG2UzfsK8WXiK+HgOdi3wNslyiyz8UONLk2wCQaL1KAMKZs21WNWQ75Vpe9oy/q3bQwWV+r9Eu0XiIidnL2PFFv3TFHjgc1F+aL4GWqcSJDz5/wQcTSMy9H2EjeuKbgk91wmdsHUZ6vhyutTWwnDHJ+jnYqfpG9mb2SyirnPYHGcXWrpZWCgcPAZCVl1Ni1iuPqibhVfb+rbjn+byOuBCaqP0BPF9jk+e19fGHqhCJo7hSM2TPQ/AE+LOs014nPHgbn2nTP5qaMiVQGn2knbilre9bhB5E4jSvhGip1iSSZrmsgbW1hTlF9+EU64S9wOd66Y1wTtpSXDrViw0Xv6tuvfOnkddNBBBx100EH7+AfDlrt/MFMJoQAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle 7.58240137440151$"
      ],
      "text/plain": [
       "7.58240137440151"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sympy.N(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC4AAAAeCAYAAABTwyyaAAAABHNCSVQICAgIfAhkiAAAAo5JREFUWIXt1zuIlUcUB/DfrsZ9iA8WSWFUfCyCsEmhAYuoBMVKCaKEaCm4aqpAIKQQC0ERjIUpgqYIqyLIFu5WRiMoFhZiYxMlQix0XTVRzCrxBSbX4nyL6/W7cx+762fhv5l755w5539nzvzPXN7j7aKpoLylgvKOCp/gJppHE2RUixtEN3rwfwG5G0YL7mNuwTzqxiacKZpEIziLr8Yi0NtUlXm4hFl4nvBrwhqsxi1cxclqwVfgPB7iLn5Bx6jovsJuHKji04XLgujsWgOvxG/i1y7NEpXQ3xDN1zFB7N7HCZ/lYsN61FEJTdibJRiJc3hUH8dcrBFlUgkz8TeuYFI9gZvRljPfjwv1BKqAPmxN2H8Wp7tpDHKZI+qtM+HzKX6VPtoPMYSpFewteCwa0ve4iCe4nn2vuWyasQE30CuOMQ+b8Uzs1OeJeN/hcML+WRZjSNQ5TM/WlLCnJtbYjoP4M1t4E1PKfLqxU9yBEo4m4v2BZQn7l1mM/WXzk/AXnubkT6IZP2VBv6ng0yGO+bH8UliGa1XyrM9yfJtjO5bZ3vjhqUfWcM29wMIKPg9wAu3YmGPfInpBCgPZOCPHdjsb28sN1V6H/+IfDCZ8erJxc9n8FKzDkSo5fhf6PS/H9kE2DuTYkhhuzyllaRIKUMKiEfPb1N68DonLWa7hp0SpVVSWaeIBtMurizBZtN6va0i8UxD/YcTcJaythTU+wj3sGDHXJWRxVWphG06LS3ZHSNE+LK4x8Rz8J943E0VrH/RmJ06hU9yXXqFqfeLtNO44I3b9C/yoDv0tGhsF8dPi2BcUS6d2tAp5LInGNK4Yyz/Lz3A8+1xNu985LBG631o0kUYwv2gC7zEeeAkYm4AfgQoefAAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle 3 \\sqrt{6}$"
      ],
      "text/plain": [
       "3⋅√6"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.norm()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "L, U, P = A.LUdecomposition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0\\\\\\frac{5}{2} & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡ 1   0⎤\n",
       "⎢      ⎥\n",
       "⎣5/2  1⎦"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}2 & 3\\\\0 & - \\frac{7}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡2   3  ⎤\n",
       "⎢       ⎥\n",
       "⎣0  -7/2⎦"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}2 & 3\\\\5 & 4\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡2  3⎤\n",
       "⎢    ⎥\n",
       "⎣5  4⎦"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L * U"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = A.solve(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}-1\\\\2\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡-1⎤\n",
       "⎢  ⎥\n",
       "⎣2 ⎦"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Numerical approach"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "A = np.array([[2, 3], [5, 4]])\n",
    "b = np.array([4, 3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.matrix_rank(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKcAAAASCAYAAAA+Ec4qAAAABHNCSVQICAgIfAhkiAAABeBJREFUaIHt2XusH1URB/BPyy2lNNgghUCByzUoFikBlYDFALWYaBFTkBho5FFAEhASY+QRUBJUggbw+Yci8gpRHkWeAXmIpASoGCAEVEAsMQrxAUUBQysVWv+YXbvde87uue29lZjfN/nll50zO2fnsTNzZhlggLcpNtsE8vfE3yZ4n4nCFnjzf/0QmxBj1bfPvyXyJuFQnFrJ2hq/bzN9H2szv5cKH/b+xL3Htnjm42pcUO15Bz6UkLUYT+Jf+CMuxcye/afg0ereNoZxJb6G72EJdsnI2Qpn69b7QCzFq/grLsc7WzwbatMuPUr5xltfyvw7Fnlz8LiIgZ3bi0MNYQtwEV5s8RyLh3s2gf2xOb7ZoK3C9Y3rT4rAfG9jnwNxL95v3RvzWXweN1YyF+IkzMPeWJl5hvPwwQR9F/wS5+CqinYylmEf/KXBO6/6nYlpmX3m4yxhrxWVXl8SwXl4xbMxNs3pUco33vpS5t+xyDsAt+MmnCACPYnjpZUcEtH/0Y5NatyG9/Xw3IpHEvQVIhgJhe7F1Mb6FDwo/6bCh4Wia43OJLfiBVFCamwmnPTjjLyHpA02CV83uiW6D681rjfUpl16lPKNp741SvxbKm+WeGF/KwJ+g7BAGHKoh28vUX5vwel4T4bvBpH1dmzQpuMNHFldz8d+iXs/I5Q9M7G2lXgLZxvtrFlYIzJ2G9dgNbZJrC2VNu5k6Yxws3iB+tBl0y49SvnGW1/K/Vsq74fV2qIuAZN7NjhKvJ19Te0nhMEXijL2LC6zfvaDK4Rj7xSlZ1LFfzt+WvHch18l9ni1+n8qsXYxzhUGbGNutc/vEmvPiKy8f2IthzWinDUxjBH9PSLdNu3So5RvvPWl3L8lmIqjRXAOi/ZmJZ4TrdJ/s31XcE6tHuaGgg0vEA3tTJwmTm8nWtfv1LizWt8DvxGp/2Ecgbd69piD53FXi/4p/EE01ikMV/8rEmt1w75rz945TBbP/oBwWK4XrtFl0z49SvkmQt9S/5ZgH2wpWqBl4jA8S9jwGzi/RMjhykp6CtsI463Fvon1S0T2WSuy5HCCp4khPI1DWvQdRDmtX7IRo8vcORXt+ITcuhH/cmJtqe4ejDhk/ADLK94/iZKbQ86mJXqU8k2kvjX6/Nsl79MV/eIWfXMR9KtUNuzKnKUlPYWXxYmb9fvHIVHaV4qAXCKUW2b9PrSNM/AT/KxF/y6+IEptDnUGmZJYq2mvd9zfhUtwCnYTY6OdRQDkkLNpiR6lfBOpb42cf0tQV8g/t+ir8XMxG92LfHBOF4PRkpKew2P4R7VZjbPF6Oh0kUGOFAecHUUPlcJCUU7a6f40/ELMGLeofnUPNKW6HrJubJI6BNRz0+UlCnVgjeiX3hSBmkLOpqV6vJ30Je3fEjzfepYm6oDdskvAIhE8G/MFaRL+icMatCdwXYL3cfw6QT9YNOApLJUfcNe/87CteFuvSMi4WgRUe3jelD8WvCjKago5m9b79OlRyrep9E35t0TeNLyCaxNr367u2Z18P1mXn9whZVj0V12YJ07Ydzdob2C7BO9yo8v6QaLH/GKLvrUYxH8O72it7VA99/niq8MLIiDuwEdavJPF2Oo2/L1HlxLshBmiVUkhZ9NSPZYU8m0qfecZ7d8SrBIJ6ijRZ65urM0WB8tncjfPECOKgzPrZ4noPqO6nitKyTXi1AXvEged9mfJRfi39fuUmaJUNWdeB4gT6bmiea9/XxVZNvcZc0T6ILGbMOTRDdpJ4g3OnVwfrWS1e7cZorx+xbrDz3QREKdkZPXZtI0R/UP4Lr7x1Hcs/i2RRySil8RXtRpzxFmk00aLdZf040Q6P6a63lY45jURZFcKx22fuf9juEfMyS4Sn78+3lj/QCU/V7pyXzjoduoeYpb6LXxH9H6zE3xzRSZaU8n6keh7a0wT46zXhdOuwoXVc+ew2NjapBEbF5yMn75j9W+fvBrvFp+nrxcTj5vEeWSAAQYYYIABBvj/w38AyAT2Qp7BaM8AAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle 7.582401374401516$"
      ],
      "text/plain": [
       "7.582401374401516"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.cond(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAALAAAAATCAYAAAAwP4ceAAAABHNCSVQICAgIfAhkiAAABYhJREFUaIHt2XvsXVMWB/DPr/21VSWCetajEsR0imCC8ah4BPUI2kyaZh46IUKGSKSYzhDv9+svj4pH0aDEM8SMMJkJM2YYGqXEIJ6ZGcwMOp7x+Plj7RP33t8557fv/d2rxP0mJydn77XX+q519tl77XXoo4/vMMaubAIrAQM4CL/C1lgTL65URt9djBUxfOvbYPcKDFVc72QonYE/4n38G9dirRHGjMPfMa+kby/ciHMTt/ux8yj0wXQsTbo2rpCZgZtwGe7GQqxdIjcPy/AJXsPVmDwKuVx/ux3nXH/hT4bPjV/0mF+W3dXxCi7E/JZrmQh6HfbC73EgdsLZychdI4w7J8m1Ej8Y72LdhrYZ+ABbdKAPdhdBvV6swmXYV3zVxQscwBIsFzEqcCSeweliwi1Pdv+BVTuQy/W323HO9Rd2wWO4uOE6CxN6yC/Xrl9ih5LBg2L13afG+ADOMzwd+QNW1IzbFXdWEL8HT5SM+Q+O70DfhnhbvJjxFePHio94cUv79KTzgvQ8EQ9pDuA4PKp5ZciVI8/fbsc5198C92JajZ1ezIMcu7WYKSbwYI3MGPGyWnGXeFllWB33YSvlxG/HR5jS0DYJn2JOB/oWpva5FXyI7XoIp5X0/VdMpgGxyuxUIvPTNP6k9JwrR56/3Y5zrr+wrUiB7ha7ctku2It5kGO3FjeIl98uNhG55uYV/QuxHaYqJz4ztS/DpiKQV+AO5QfPOn0T8CG+xMn4q5gsL6fn4iXNNXxiFXgq9VX5QxwMh9K9DmVy7fpbYDRxbsff3+ANzTnoNVq28S7zy7I7psb4BBwiVodcjMFsPCLyvI9KZGaJrWtpjZ4HcCx+iGfxZzHxZuOLNvX9SOSbK/AXsfJsmDieL/I0YsWBjUp0fJDu69Rwni6C/bsamSq5dvylO3Fux99zxaF3cuL5Fo7Aogrd3ZoH7dptwmFGTh9acTSuxEvia3ld82FgA7GlFB/OVNW5D1yFj5PM38QX3YgcfT9JbRe3jB0vAvJx4rie2LJfNfzDfizp2KaC5yCexwEV/blyI/lboBtxHo2/a4uJN4Qde8SvE7tNWKKz9EEidnky1Hjouk2QLTBVOfFBXIdLxSqwJMm9qTlPzNE3K7WdUMJzcerbLT1fkJ7PSxwGcbiYVF+qLgctwCkVfTlyuf62YrRx7tRf4tA/hON6yG9Eu1UpxCSRo7WTPjSiyDc/x5ap7Vg8LGqDq6SryGXGpeditV8gykjzxS4wR+RqU3Bqm/reSG1ltdd/pntR0lqAX4sVcplYJcaLPPQp/K9ExyFJ99klfblyOf6WoRtxbtffAk+K0t8qPeTXqV1zRSBH+6fubZGIE8Xtqh8lxXV6kn0at5boWyrqqu3om4j3cEuJvsuS3A9qfJifZI4q6dsbF9WMzZXL8bcOnca5DHX+NmIA/8eh3zC/LLv3qE8fqnKzRmwkcqziBDpNHKAar8MS4bPSc3GgeFzUD1txuziItavvKjGJW2vAD+AF1T82NhWHnScM/5j3wCUlY9bEnm3K5fhbhdHEuRV1/rZiT5HilJXOesUvy+4aova2d0X/ycnYiQ3yD+MMXyfqk8Sv0GNqiFCd+8zFZ5rrqJPFtlNXy63SN0XsKL9taJsuTsdVfq4mXuRzmv+QEX/1XhHb+ykN15li1ZzcplyOv72Ic46/P8a/cLOo3sBm4pDZ+Ku72/xy7Q7DPPXpw+FiCf95ep4oSkIfJoOLxC/p7UcgXUW8wH54UNT9LhIHm/1HoW9zUVddIk7Id4q8sww7i5xwkeG/VLcX/ldtf4vblCswkr+9ijP1/q4jJuEK8UFdLybp+i1y3eaXZbdq6/y+4meiFvu5yEmXr1w6Pcf3zd8++uijjz766KMP+ApOpWRqcvl7XAAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle 7.3484692283495345$"
      ],
      "text/plain": [
       "7.3484692283495345"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.norm(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "P, L, U = la.lu(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [0.4, 1. ]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5. , 4. ],\n",
       "       [0. , 1.4]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5., 4.],\n",
       "       [2., 3.]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(L, U)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 3.],\n",
       "       [5., 4.]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(P, np.dot(L, U))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 3.],\n",
       "       [5., 4.]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P.dot(L.dot(U))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.,  2.])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "la.solve(A, b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Example : rank and condition numbers -> numerical errors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "p = sympy.symbols(\"p\", positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "A = sympy.Matrix([[1, sympy.sqrt(p)], [1, 1/sympy.sqrt(p)]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "b = sympy.Matrix([1, 2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{2 p - 1}{p - 1}\\\\- \\frac{\\sqrt{p}}{p - 1}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡2⋅p - 1⎤\n",
       "⎢───────⎥\n",
       "⎢ p - 1 ⎥\n",
       "⎢       ⎥\n",
       "⎢  -√p  ⎥\n",
       "⎢ ───── ⎥\n",
       "⎣ p - 1 ⎦"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sympy.simplify(A.solve(b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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yIazdOVaAKoqSnNl0ftonogEFGDJZucXv/gFr7zyCgBXXnnlem3j6aef5qmnnmrWss8//3zufUsGucjPYC1aFDyO59///neuvG/fvnzyySd88MEHvPnmm/To0aPgtn/4wx8yaNAgFi5cyOeff96sejfHpEmTuOKKK1izZg3ZbJazzjqLww47jHHjxuXOsYiIbPyWrFhDRWmKitJ0rqxj+yDA+kIBlkg9RQmwzGy4md1uZleZWYM7VjOrMLPbzOwSM/tdOGSuJIS7M3PmTLLZwin+d999Nzc63frIZDKceOKJXH755bg7Z5xxBlVVVfzwhz9k9erV66xba/3973/njjvuwN2ZPn06F154IaWlpfTt25f58+fnMkLNNXPmTA466CAOPvhg3n777XUu/+qrrwJQWVmZC5I++eSTBud7XQHWp59+CkBNTQ3ZbJZMJkPnzp2bXe8DDzwQgKlTW/ZYn+eee44HHnigQXk2m2XMmDFcc801VFVVUV5ezu233055eTkAN998c4N1br/9dr75zW+yfPnyFtWhkLVr1zb5+XF3lixZwtq1Lb/wX3/99Zx00klMnDgx9/80bdo0Lr/8cj755JMWb2/FihXcdttt/Oc//2nxuiIiSbBkxVo6VpbVK+tQXkI6ZXy+Yk0b1Uokody9VS+gHTAfKA+nHwAOzFvmYuDC8P0uwHPN2fbXv/51L7bHHnvM//CHP+Smly9f7tlstsFy77//vh9++OG+3377+XHHHecrVqzwZcuW+ZgxY3zSpEnu7j5//ny/4oor/Hvf+55fcskl/sUXX/jFF1/sO+64o59xxhm+YMECd3dftmyZX3PNNf7qq6822M/q1at93Lhxfs899/iUKVN8xIgRvt9++/nPf/5z/+yzz9zdPZPJ+Jo1a9zdfe3atX7MMcd4ly5dvLS01M8555zctj7//HOfMmWKv/jii7569Wr/4IMPvKamxt3d3333XT/mmGP86KOP9jPPPNMvuugif/zxx93d/aijjnLAhw0b5plMxvfYYw/v27ev/+tf//Lhw4c74O3bt/e99trL27Vr51VVVX7CCSf4ueee69/73vf8mGOO8QsuuMDfe+89nzZtmn/nO9/x+++/P3d+t9tuOwcc8C222CL3HvCKigp/7LHH/OKLL/bKykofOHCgP/LII+7u/tprr3l5ebkfdNBB6/3/ffvtt7uZOeBbbrllbr8TJkzwBx980AE/5JBDmtzGT37yE+/bt6+Xlpb6Lrvs4hUVFbntfO1rX1tnHXbeeWcHfNCgQQ74zJkzHfCLL7643nJlZWX1tnf66ac74E8++aS7u48YMSK3z4ULFzrghx56aLPPxbRp0xzwMWPGNHsdd/f27dt7KpXytWvX1iu/9957HfA+ffp4RUWFd+nSxUePHu3Lli3zkpIS32qrrRpsq127dg54dXW1L1682N3da2trfdq0ac2qy5tvvun77LOPp1Kp3P9B7969/fe//3295Y477rjc//s222xT8G+8Mc8880y9z+gOO+zgTz/9dG57gB9zzDG55Wtra33y5Mk+atQo79q1q/fs2dNHjRrlixYtcnf3H/zgB7n6br311p7NZv2EE07wbt26+bx58/yFF17w6upq//a3v+0rVqzwRYsW5c7NqlWr/LTTTvM33nijWXVfvny5f/vb3/aePXt6hw4dfMCAAX7eeed5bW2tu7u//vrrvmrVKnd3nzdvnt955525dadPn+7/+c9/Cm43m836d7/7XS8pKfEjjjjCFy5c6LNnz/Yvvvii2ed1XYC53srrUVu9voprlUjSnHL3yz7ilzMblP/X1U/4pQ827ztKZGPX3GtVMQKsA4GnY9PnAb/IW+Y5YN/Y9FKgal3bbs1Fa+3atf7Tn/7Ue/Xq5Wbmffr08W9/+9u5G6S99trLd9xxRwe8pKTEe/Xq5bvttpsfdthhPnbsWE+n0/VusrbYYguvrKxsNFBo7LXNNtt4SUlJbrpz586+6667+tFHH+233367d+zYscn1Kysr3czczPz444/3Xr16OeBlZWW5G/0tt9zSy8rKGt1G+/btG53Xt29fB3I3jz169GiwTNeuXb20tDR33E3tK/6qrq7O3Vjuu+++PnToUAd8wIAB/vnnn/s555xT76Y1fp6GDx9e7xxPnDjR3d1feuklHzJkiFdVVXk6nfYePXr4jTfe6JlMxpcuXeqDBg3yvffe25cvX+6nnXaaA15aWurDhw93M/N27dr5jBkzcp+Tjh07ejqd9mXLltX7/KxYscKz2awfcsghufPTpUuXXH2uvvrqXPB58MEH+4oVKxr9LHbu3Nnbt2/vxxxzjAPev39/B3zkyJH1listLfXevXvnpv/7v//bAf/rX//q7u577bVX7v/78ccfd8BPP/30Zv9NrFmzJhfoNeaWW27xp556Kjc9ZcqU3DH/9re/rbdsVJ933nmnwXZ22WUXB/zTTz/NlU2aNMmB3HncaqutfM2aNb7nnns64KNGjaq3jWw265999pl/8MEH7u4+efLk3Oele/fuvvfee/sOO+yQK3v55Zfd3f3KK690wKuqqrxnz54O+GWXXebz5s3z4cOH+0EHHeRnnHGG//vf/y54DqK/gd/85jf+9a9/PXf8ZuY/+tGPcn+zjzzyiJ955pn1gr2SkpLcdMeOHf3II4/M1WX77bd3wAcOHJhbvqysrN760Xsz81tuucUHDBiQ2+59993nv/3tb33ffff1iooKHzRokC9fvtxHjhzpZWVlPmjQoFwAW1JSUu/vfptttvHdd9899/mZOHFi7u9t1KhRuc854N26dfPevXv7Vltt5ZWVlb7lllt6dXW1Aw2+FwHv16+f33vvvev49K2bAiyRZPv+b2b50Xe+0KB8/xun+5kTX2mDGolseBsywDoWeCg2fSowMW+ZfwK7xaY/BLZrZHtjgbnA3F69eq33CVi5cqWnUik3M99mm23qBTjxjMp2223nW2+9db2b++gG5a677vJVq1blbnSjG6x9993Xy8vLfbfddvNbb73VX3vtNb/88st9wIABftppp/lnn33md9xxh++6665uZt6+fXs/55xzfMiQIfWyH9Hr2GOP9QsuuMBPPvlknzNnji9cuNCvvPJKHzx4sHfq1Ml32GEHr6qqyi0/cuRIz2az/uWXX/pee+3l5eXluRvOH/3oR37cccf50KFD/dBDD/UhQ4Z4hw4dvG/fvn7ffff566+/7lOnTvV77rknd/NWUVHh//jHP3KB04ABA/yuu+7y8vJyHzx4sK9du9bXrl2b+3U7k8n4n/70J588ebLPmzfP33jjDb/tttt8n3328ZEjR/pDDz3ku+22m6dSKe/Zs6dfeeWVuf+XRYsW1csmzJkzx7faaivfa6+9fOnSpf7222/ngkjAjz/+eE+lUl5WVpa7yQO8Q4cO/rWvfa1edioerEb/n506dfL58+e7u/vSpUtzmcDIT37yEwf85JNPdvcge7HVVlvVu9nt3bu3L1++3N3d3377bZ88eXLuM9a9e3cHvLy83C+55JJcpiAunU573759/aabbqr3//6Nb3yj3nIlJSXer1+/3PT555/vgE+ZMsXdPXdjXlZW5rfccosDPm7cuBb9XWyxxRa+5ZZbFpz30Ucf5QLSKDDabbfdcvXdc889/fnnn/eOHTv6//zP/3hJSYl37dq14Lauu+46hyDD1rt3b7/wwgt9p512csDfe+89//73v18voI/O9bbbbuu9evXy9u3b1wu+u3fv7mbm6XTaH3zwwXr7euqpp3KBQfS3WllZ6Z988okvX77cy8rKvKSkpMHfOAQ/PlRWVnpFRYW3a9fO+/Tp44AfcMAB7h581ocMGeKA33rrre7u/o9//CNXF8IfHU466SSfPXu2Z7NZz2azfsYZZ+T20aVLF1++fLmvWrXKO3TokPubiz57qVTK77//fr/wwgt966239r333rvejxj9+/evF4QBuUAqKo++V8zMzz///Ny5WbFihY8aNSq33tZbb10vYIz/TfXo0cN33nlnLysr89LSUq+oqPDq6upcoLbPPvvkfrg6+OCD/bjjjvPtttvOzcyvvfbaFn0OC1GAJZJsB940w0//49wG5d+9fZYf99vZbVAjkQ1vQwZYicxguQe/vkdNbV588UW/5JJLfPXq1Z7NZv2Xv/ylP/HEE/WWz2az/s477/iECRP8448/rjfvnXfe8ffee6/FdSjUNCmbzfqMGTP8Rz/6Ub1sQVPWrFnjp556ql944YUtrkNT/vKXv+SaMk6fPt0PP/xwX7lyZVH30VKZTMZPPfVUP+mkk9zd/dJLL839ej548GCfObOuicLixYv9qKOOyt2Mn3rqqbnM2M477+xffvllk/uqra31yspKLy0t9bPOOit3szlo0CDv3bu377///g2Csvy6XnTRRbmb93bt2vns2XUXmpqamtwN+yuvvFLvJnn77bevt610Ou3bbbddbjo67ih7FwWeZubnnntuveCruaIgLZPJNJh3yimn5Oq2xx57+JIlS9zM/Gtf+5p37tzZS0tLcxmh6HXKKacU3M+SJUsaBDNRtiM6b/369csFjO+//37u+EpKSrxjx47ev39/HzZsmA8ePNjNzFOpVKNNCQ8//PDcPiorK33OnDm5eVdffXXuvI0fP96XLFniv/71r33AgAHepUsXr66u9m7duuUC9JKSknqZN/cgOI+LAqju3bv7559/XrBOZ599tvfs2dM//PDDXNn06dO9X79+PmvWLHd3nzt3rv/zn/9ssO67777rXbt29cGDB3sm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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Symbolic problem specification\n",
    "p = sympy.symbols(\"p\", positive=True)\n",
    "A = sympy.Matrix([[1, sympy.sqrt(p)], [1, 1/sympy.sqrt(p)]])\n",
    "b = sympy.Matrix([1, 2])\n",
    "\n",
    "# Solve symbolically\n",
    "x_sym_sol = A.solve(b)\n",
    "x_sym_sol.simplify()\n",
    "x_sym_sol\n",
    "Acond = A.condition_number().simplify()\n",
    "\n",
    "# Function for solving numerically\n",
    "AA = lambda p: np.array([[1, np.sqrt(p)], [1, 1/np.sqrt(p)]])\n",
    "bb = np.array([1, 2])\n",
    "x_num_sol = lambda p: np.linalg.solve(AA(p), bb)\n",
    "\n",
    "# Graph the difference between the symbolic (exact) and numerical results.\n",
    "p_vec = np.linspace(0.9, 1.1, 200)\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n",
    "\n",
    "for n in range(2):\n",
    "    x_sym = np.array([x_sym_sol[n].subs(p, pp).evalf() for pp in p_vec])\n",
    "    x_num = np.array([x_num_sol(pp)[n] for pp in p_vec])\n",
    "    axes[0].plot(p_vec, (x_num - x_sym)/x_sym, 'k')\n",
    "axes[0].set_title(\"Error in solution\\n(numerical - symbolic)/symbolic\")\n",
    "axes[0].set_xlabel(r'$p$', fontsize=18)\n",
    "\n",
    "axes[1].plot(p_vec, [Acond.subs(p, pp).evalf() for pp in p_vec])\n",
    "axes[1].set_title(\"Condition number\")\n",
    "axes[1].set_xlabel(r'$p$', fontsize=18)\n",
    "\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-linear-systems-condition-number.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Rectangular systems"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Underdetermined"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "unknown = sympy.symbols(\"x, y, z\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "A = sympy.Matrix([[1, 2, 3], [4, 5, 6]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = sympy.Matrix(unknown)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "b = sympy.Matrix([7, 8])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "AA = A * x - b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left\\{ x : z - \\frac{19}{3}, \\  y : \\frac{20}{3} - 2 z\\right\\}$"
      ],
      "text/plain": [
       "{x: z - 19/3, y: 20/3 - 2⋅z}"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sympy.solve(A*x - b, unknown)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Overdetermined: least squares"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(1234)\n",
    "\n",
    "# define true model parameters\n",
    "x = np.linspace(-1, 1, 100)\n",
    "a, b, c = 1, 2, 3\n",
    "y_exact = a + b * x + c * x**2\n",
    "\n",
    "# simulate noisy data points\n",
    "m = 100\n",
    "X = 1 - 2 * np.random.rand(m)\n",
    "Y = a + b * X + c * X**2 + np.random.randn(m)\n",
    "\n",
    "# fit the data to the model using linear least square\n",
    "A = np.vstack([X**0, X**1, X**2])  # see np.vander for alternative\n",
    "sol, r, rank, sv = la.lstsq(A.T, Y)\n",
    "y_fit = sol[0] + sol[1] * x + sol[2] * x**2\n",
    "fig, ax = plt.subplots(figsize=(12, 4))\n",
    "\n",
    "ax.plot(X, Y, 'go', alpha=0.5, label='Simulated data')\n",
    "ax.plot(x, y_exact, 'k', lw=2, label='True value $y = 1 + 2x + 3x^2$')\n",
    "ax.plot(x, y_fit, 'b', lw=2, label='Least square fit')\n",
    "ax.set_xlabel(r\"$x$\", fontsize=18)\n",
    "ax.set_ylabel(r\"$y$\", fontsize=18)\n",
    "ax.legend(loc=2);\n",
    "\n",
    "fig.savefig('ch5-linear-systems-least-square.pdf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# fit the data to the model using linear least square: \n",
    "# 1st order polynomial\n",
    "A = np.vstack([X**n for n in range(2)])\n",
    "sol, r, rank, sv = la.lstsq(A.T, Y)\n",
    "y_fit1 = sum([s * x**n for n, s in enumerate(sol)])\n",
    "\n",
    "# 15th order polynomial\n",
    "A = np.vstack([X**n for n in range(16)])\n",
    "sol, r, rank, sv = la.lstsq(A.T, Y)\n",
    "y_fit15 = sum([s * x**n for n, s in enumerate(sol)])\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 4))\n",
    "ax.plot(X, Y, 'go', alpha=0.5, label='Simulated data')\n",
    "ax.plot(x, y_exact, 'k', lw=2, label='True value $y = 1 + 2x + 3x^2$')\n",
    "ax.plot(x, y_fit1, 'b', lw=2, label='Least square fit [1st order]')\n",
    "ax.plot(x, y_fit15, 'm', lw=2, label='Least square fit [15th order]')\n",
    "ax.set_xlabel(r\"$x$\", fontsize=18)\n",
    "ax.set_ylabel(r\"$y$\", fontsize=18)\n",
    "ax.legend(loc=2);\n",
    "\n",
    "fig.savefig('ch5-linear-systems-least-square-2.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Eigenvalue problems"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "eps, delta = sympy.symbols(\"epsilon, delta\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\epsilon & \\delta\\\\\\delta & - \\epsilon\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡ε  δ ⎤\n",
       "⎢     ⎥\n",
       "⎣δ  -ε⎦"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "H = sympy.Matrix([[eps, delta], [delta, -eps]])\n",
    "H"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "eval1, eval2 = H.eigenvals()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAM4AAAAfCAYAAACvffJOAAAABHNCSVQICAgIfAhkiAAABS9JREFUeJzt3FmsXVMcx/FPq5SrqirUWHNMuaiKihBDH2iK6IM51DzFEImWSEjV8CIxBFESQ0whYkxItch9IMbEUGIOoaagZjVfD/9T9/Tes8/Z++x9eo90fZOTm732Gn77t85ee+3/WueSSCQ6whrDLSCRGAZKfe97cG1FQspyOvpX4s9wsLJ7Prtd427H7u0WrpCd8AlGDreQlYjkOZdhRtFCh+OG6rW0xfW4dLhFrGQkzxmNV7B+3gI9+BTbdkpRAUbjG2xeoo6pWISfsBCblZdVCd2qK3k+wGzclrfyc/B829Kq5SgsKFF+A9wtph4H4CM8XYGusnSrLpLn9WyI37BlngbeFzdPN/A0jihR/misXXd8vDBiuOlWXSTPB/MUrm6VaYqIKOzRjrKK2QJfi6lDVUzDexXWVxXdoit5PpQr8bm6QEmjiMk0/IM3KpFWjpNwD35vke8oPIgPRKfPw6iMvJNwU1UCK6RbdCXPh/KqmLJNapZpId6uQFRZVsFi9LbIN110NjEQ3CGemJs0yLsm7pfdwVlMxg4FyxShXV1VkzxvzNbi+s5tlmkxnimvqzTT8VKOfJdjZt3xSEzMyDsHE9rQ0ie+HJ1ijvZ0VU3yvDFjxI0zLyvDaDFNe6S0rPI8hFNz5OsVocULxIiZxanYpu54tQJa+nSuE8voqprkeTZ/Yf6yg8HvOGMxQpjSKXbDE7V2slgf++O+HPUtwmG4BC9oHDaciaWik7fDPiLC0mmmiveFWTgPjwqPV7Su5Hl5XT9bPiK3HJuKR1KnXuROEOG/fuzbJN8s+Ueb/XGjiHy8gc+wUd35A8VoMXgfUpHF3b4CepZxIb4SnhKLif0GwvxV6MpD8rwazxfjtayTE2oVFRWch1NwsXh/6sedTfK+g71a1DdCbEB908CWiA2EMdeU0DmuwedZ3NsgfUxGHWNEVOrmurSx4pq3L6GtKMnz6jxfghezTvYIgx/KON8n/87SkzPqGI9fap+xDc7vhXebXwPi5e4PQ035Ao/nKJ9Fkd2zfRl1jMefIlzbbHq0okiel+dPsRCKoaG4X8UepUbmwnHi5srDFxnpS8TFHYsjccug8yfj1hZ1T8RFYkSqD52vhnXwXU6Njdi7Qdr14nquHJT+Q0YdP4p59kwRpeoRoc+5JXSVIXlejh5xr3zcLNOzeL2Cxpqxnxg9Bu+HWwvfax0mPLNW/tBB6QfV0mcOKVGOPvmnr6PE1Ohj8VLeLSTP22eiuMZZzTJdJeaKnQyLjsCHNTH1j/3T8HCO8hfWyu40qM7n8RZWrUbmf/TJ34mHCm1nNDjXLHTbijJlSZ6X4eBa/XsuS2i05WahuGl2rKDBLOoDECfWpZ+k9ZQBnqv93bQubY5YuZ4h5qPDxdLa3/ov55pie3q7K+H31urNs8aSRfK8fXYVU9GXm2VaRYT0TqmgwWZMxN/4Ujxqe0VYM+8IcYYYlc4XEZ3rFPjBUUH6FIs0zhW/Z3odDwh9G5do/wGxML2oRB0kz9vlMctH65qKeLKiRpuxQIyEh4hOuGIFtNkOvZZfaR4ORuGuCupJnhdjnAia7Zwn87r4VnV3bBZHik6cL3bYbtXh9v7PXIRdKqgneV6M08UTJzdn6/xvzlcXodJ+3bGxtFuZosWW9gIkz/MzUgQ/Cj35Roo7rdOPyxtFJx7T4XYSAyTP83GWNn8JvZ4wuZNMFhGL1TvcTmKA5HlrNhTvgG2zXkVCmpHrHyEkKiV53pzxqlkDSiQSiUQikUisWP4F1+8vVtEj+W8AAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle \\left( - \\sqrt{\\delta^{2} + \\epsilon^{2}}, \\  \\sqrt{\\delta^{2} + \\epsilon^{2}}\\right)$"
      ],
      "text/plain": [
       "⎛    _________     _________⎞\n",
       "⎜   ╱  2    2     ╱  2    2 ⎟\n",
       "⎝-╲╱  δ  + ε  , ╲╱  δ  + ε  ⎠"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eval1, eval2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[ \\left( - \\sqrt{\\delta^{2} + \\epsilon^{2}}, \\  1, \\  \\left[ \\left[\\begin{matrix}- \\frac{\\delta}{\\epsilon + \\sqrt{\\delta^{2} + \\epsilon^{2}}}\\\\1\\end{matrix}\\right]\\right]\\right), \\  \\left( \\sqrt{\\delta^{2} + \\epsilon^{2}}, \\  1, \\  \\left[ \\left[\\begin{matrix}- \\frac{\\delta}{\\epsilon - \\sqrt{\\delta^{2} + \\epsilon^{2}}}\\\\1\\end{matrix}\\right]\\right]\\right)\\right]$"
      ],
      "text/plain": [
       "⎡⎛                  ⎡⎡      -δ        ⎤⎤⎞  ⎛                 ⎡⎡      -δ       \n",
       "⎢⎜    _________     ⎢⎢────────────────⎥⎥⎟  ⎜   _________     ⎢⎢───────────────\n",
       "⎢⎜   ╱  2    2      ⎢⎢       _________⎥⎥⎟  ⎜  ╱  2    2      ⎢⎢       ________\n",
       "⎢⎜-╲╱  δ  + ε  , 1, ⎢⎢      ╱  2    2 ⎥⎥⎟, ⎜╲╱  δ  + ε  , 1, ⎢⎢      ╱  2    2\n",
       "⎢⎜                  ⎢⎢ε + ╲╱  δ  + ε  ⎥⎥⎟  ⎜                 ⎢⎢ε - ╲╱  δ  + ε \n",
       "⎢⎜                  ⎢⎢                ⎥⎥⎟  ⎜                 ⎢⎢               \n",
       "⎣⎝                  ⎣⎣       1        ⎦⎦⎠  ⎝                 ⎣⎣       1       \n",
       "\n",
       " ⎤⎤⎞⎤\n",
       "─⎥⎥⎟⎥\n",
       "_⎥⎥⎟⎥\n",
       " ⎥⎥⎟⎥\n",
       " ⎥⎥⎟⎥\n",
       " ⎥⎥⎟⎥\n",
       " ⎦⎦⎠⎦"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "H.eigenvects()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "(eval1, _, evec1), (eval2, _, evec2) = H.eigenvects()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "[0]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sympy.simplify(evec1[0].T * evec2[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 3, 5],\n",
       "       [3, 5, 3],\n",
       "       [5, 3, 9]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = np.array([[1, 3, 5], [3, 5, 3], [5, 3, 9]])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "evals, evecs = la.eig(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([13.35310908+0.j, -1.75902942+0.j,  3.40592034+0.j])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.42663918,  0.90353276, -0.04009445],\n",
       "       [ 0.43751227, -0.24498225, -0.8651975 ],\n",
       "       [ 0.79155671, -0.35158534,  0.49982569]])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evecs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.75902942,  3.40592034, 13.35310908])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "la.eigvalsh(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Nonlinear equations"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Univariate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x216 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-2, 2, 1000)\n",
    "\n",
    "# four examples of nonlinear functions\n",
    "f1 = x**2 - x - 1\n",
    "f2 = x**3 - 3 * np.sin(x)\n",
    "f3 = np.exp(x) - 2\n",
    "f4 = 1 - x**2 + np.sin(50 / (1 + x**2))\n",
    "\n",
    "# plot each function\n",
    "fig, axes = plt.subplots(1, 4, figsize=(12, 3), sharey=True)\n",
    "\n",
    "for n, f in enumerate([f1, f2, f3, f4]):\n",
    "    axes[n].plot(x, f, lw=1.5)\n",
    "    axes[n].axhline(0, ls=':', color='k')\n",
    "    axes[n].set_ylim(-5, 5)\n",
    "    axes[n].set_xticks([-2, -1, 0, 1, 2])\n",
    "    axes[n].set_xlabel(r'$x$', fontsize=18)\n",
    "\n",
    "axes[0].set_ylabel(r'$f(x)$', fontsize=18)\n",
    "\n",
    "titles = [r'$f(x)=x^2-x-1$', r'$f(x)=x^3-3\\sin(x)$',\n",
    "          r'$f(x)=\\exp(x)-2$', r'$f(x)=\\sin\\left(50/(1+x^2)\\right)+1-x^2$']\n",
    "for n, title in enumerate(titles):\n",
    "    axes[n].set_title(title)\n",
    "    \n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-nonlinear-plot-equations.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Symbolic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x, a, b, c = sympy.symbols(\"x, a, b, c\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "e = a + b*x + c*x**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left( \\frac{- b + \\sqrt{- 4 a c + b^{2}}}{2 c}, \\  - \\frac{b + \\sqrt{- 4 a c + b^{2}}}{2 c}\\right)$"
      ],
      "text/plain": [
       "⎛        _____________   ⎛       _____________⎞ ⎞\n",
       "⎜       ╱           2    ⎜      ╱           2 ⎟ ⎟\n",
       "⎜-b + ╲╱  -4⋅a⋅c + b    -⎝b + ╲╱  -4⋅a⋅c + b  ⎠ ⎟\n",
       "⎜─────────────────────, ────────────────────────⎟\n",
       "⎝         2⋅c                     2⋅c           ⎠"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol1, sol2 = sympy.solve(e, x)\n",
    "\n",
    "sol1, sol2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABHNCSVQICAgIfAhkiAAAANRJREFUKJHN0T1Kg1EQheHHaApBsIiFP5AUovZW6losbAQ34AKyFRHLgO5BcAkqighqCi20sDCgWHwTGD6msXOawz1z3zMwwx9rpvXuY4gnLGIZx3is4AFecJC8IzxjpQLOIzlPncUYp+3Pq/jBSRF0hgl60AlzN5JvCuAaXexloB/6VgCvoesZmA+dFMBX6EIGpsndAph6nxkYh/YKYCn0LgNXmi1tFMAWvnHZblzgoeV1NLcZFUE28YH95B3iXWwI5lLzVrPrIbYjfQ07uK8m/JP6BfjqI2oeUfGRAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.subs(x, sol1).expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABHNCSVQICAgIfAhkiAAAANRJREFUKJHN0T1Kg1EQheHHaApBsIiFP5AUovZW6losbAQ34AKyFRHLgO5BcAkqighqCi20sDCgWHwTGD6msXOawz1z3zMwwx9rpvXuY4gnLGIZx3is4AFecJC8IzxjpQLOIzlPncUYp+3Pq/jBSRF0hgl60AlzN5JvCuAaXexloB/6VgCvoesZmA+dFMBX6EIGpsndAph6nxkYh/YKYCn0LgNXmi1tFMAWvnHZblzgoeV1NLcZFUE28YH95B3iXWwI5lLzVrPrIbYjfQ07uK8m/JP6BfjqI2oeUfGRAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.subs(x, sol2).expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "e = a * sympy.cos(x) - b * sympy.sin(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left( - 2 \\operatorname{atan}{\\left(\\frac{b - \\sqrt{a^{2} + b^{2}}}{a} \\right)}, \\  - 2 \\operatorname{atan}{\\left(\\frac{b + \\sqrt{a^{2} + b^{2}}}{a} \\right)}\\right)$"
      ],
      "text/plain": [
       "⎛       ⎛       _________⎞         ⎛       _________⎞⎞\n",
       "⎜       ⎜      ╱  2    2 ⎟         ⎜      ╱  2    2 ⎟⎟\n",
       "⎜       ⎜b - ╲╱  a  + b  ⎟         ⎜b + ╲╱  a  + b  ⎟⎟\n",
       "⎜-2⋅atan⎜────────────────⎟, -2⋅atan⎜────────────────⎟⎟\n",
       "⎝       ⎝       a        ⎠         ⎝       a        ⎠⎠"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol1, sol2 = sympy.solve(e, x)\n",
    "\n",
    "sol1, sol2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABHNCSVQICAgIfAhkiAAAANRJREFUKJHN0T1Kg1EQheHHaApBsIiFP5AUovZW6losbAQ34AKyFRHLgO5BcAkqighqCi20sDCgWHwTGD6msXOawz1z3zMwwx9rpvXuY4gnLGIZx3is4AFecJC8IzxjpQLOIzlPncUYp+3Pq/jBSRF0hgl60AlzN5JvCuAaXexloB/6VgCvoesZmA+dFMBX6EIGpsndAph6nxkYh/YKYCn0LgNXmi1tFMAWvnHZblzgoeV1NLcZFUE28YH95B3iXWwI5lLzVrPrIbYjfQ07uK8m/JP6BfjqI2oeUfGRAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.subs(x, sympy.atan(a/b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABHNCSVQICAgIfAhkiAAAANRJREFUKJHN0T1Kg1EQheHHaApBsIiFP5AUovZW6losbAQ34AKyFRHLgO5BcAkqighqCi20sDCgWHwTGD6msXOawz1z3zMwwx9rpvXuY4gnLGIZx3is4AFecJC8IzxjpQLOIzlPncUYp+3Pq/jBSRF0hgl60AlzN5JvCuAaXexloB/6VgCvoesZmA+dFMBX6EIGpsndAph6nxkYh/YKYCn0LgNXmi1tFMAWvnHZblzgoeV1NLcZFUE28YH95B3iXWwI5lLzVrPrIbYjfQ07uK8m/JP6BfjqI2oeUfGRAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.subs(x, sol1).simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABHNCSVQICAgIfAhkiAAAANRJREFUKJHN0T1Kg1EQheHHaApBsIiFP5AUovZW6losbAQ34AKyFRHLgO5BcAkqighqCi20sDCgWHwTGD6msXOawz1z3zMwwx9rpvXuY4gnLGIZx3is4AFecJC8IzxjpQLOIzlPncUYp+3Pq/jBSRF0hgl60AlzN5JvCuAaXexloB/6VgCvoesZmA+dFMBX6EIGpsndAph6nxkYh/YKYCn0LgNXmi1tFMAWvnHZblzgoeV1NLcZFUE28YH95B3iXWwI5lLzVrPrIbYjfQ07uK8m/JP6BfjqI2oeUfGRAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.subs(x, sol2).simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "NotImplementedError",
     "evalue": "multiple generators [x, sin(x)]\nNo algorithms are implemented to solve equation -x + sin(x)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-68-d3ec18de60c6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msympy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msympy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/miniconda3/envs/py3.6/lib/python3.6/site-packages/sympy/solvers/solvers.py\u001b[0m in \u001b[0;36msolve\u001b[0;34m(f, *symbols, **flags)\u001b[0m\n\u001b[1;32m   1169\u001b[0m     \u001b[0;31m###########################################################################\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1170\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mbare_f\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1171\u001b[0;31m         \u001b[0msolution\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_solve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mflags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1172\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1173\u001b[0m         \u001b[0msolution\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_solve_system\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mflags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/py3.6/lib/python3.6/site-packages/sympy/solvers/solvers.py\u001b[0m in \u001b[0;36m_solve\u001b[0;34m(f, *symbols, **flags)\u001b[0m\n\u001b[1;32m   1740\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1741\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1742\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\n'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnot_impl_msg\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1743\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1744\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'simplify'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNotImplementedError\u001b[0m: multiple generators [x, sin(x)]\nNo algorithms are implemented to solve equation -x + sin(x)"
     ]
    }
   ],
   "source": [
    "sympy.solve(sympy.sin(x)-x, x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bisection method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# define a function, desired tolerance and starting interval [a, b]\n",
    "f = lambda x: np.exp(x) - 2\n",
    "tol = 0.1\n",
    "a, b = -2, 2\n",
    "x = np.linspace(-2.1, 2.1, 1000)\n",
    "\n",
    "# graph the function f\n",
    "fig, ax = plt.subplots(1, 1, figsize=(12, 4))\n",
    "\n",
    "ax.plot(x, f(x), lw=1.5)\n",
    "ax.axhline(0, ls=':', color='k')\n",
    "ax.set_xticks([-2, -1, 0, 1, 2])\n",
    "ax.set_xlabel(r'$x$', fontsize=18)\n",
    "ax.set_ylabel(r'$f(x)$', fontsize=18)\n",
    "\n",
    "# find the root using the bisection method and visualize\n",
    "# the steps in the method in the graph\n",
    "fa, fb = f(a), f(b)\n",
    "\n",
    "ax.plot(a, fa, 'ko')\n",
    "ax.plot(b, fb, 'ko')\n",
    "ax.text(a, fa + 0.5, r\"$a$\", ha='center', fontsize=18)\n",
    "ax.text(b, fb + 0.5, r\"$b$\", ha='center', fontsize=18)\n",
    "\n",
    "n = 1\n",
    "while b - a > tol:\n",
    "    m = a + (b - a)/2\n",
    "    fm = f(m)\n",
    "\n",
    "    ax.plot(m, fm, 'ko')\n",
    "    ax.text(m, fm - 0.5, r\"$m_%d$\" % n, ha='center')\n",
    "    n += 1\n",
    "    \n",
    "    if np.sign(fa) == np.sign(fm):\n",
    "        a, fa = m, fm\n",
    "    else:\n",
    "        b, fb = m, fm\n",
    "\n",
    "ax.plot(m, fm, 'r*', markersize=10)\n",
    "ax.annotate(\"Root approximately at %.3f\" % m,\n",
    "            fontsize=14, family=\"serif\",\n",
    "            xy=(a, fm), xycoords='data',\n",
    "            xytext=(-150, +50), textcoords='offset points', \n",
    "            arrowprops=dict(arrowstyle=\"->\", connectionstyle=\"arc3, rad=-.5\"))\n",
    "\n",
    "ax.set_title(\"Bisection method\")\n",
    "\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-nonlinear-bisection.pdf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# define a function, desired tolerance and starting point xk\n",
    "tol = 0.01\n",
    "xk = 2\n",
    "\n",
    "s_x = sympy.symbols(\"x\")\n",
    "s_f = sympy.exp(s_x) - 2\n",
    "\n",
    "f = lambda x: sympy.lambdify(s_x, s_f, 'numpy')(x)\n",
    "fp = lambda x: sympy.lambdify(s_x, sympy.diff(s_f, s_x), 'numpy')(x)\n",
    "\n",
    "x = np.linspace(-1, 2.1, 1000)\n",
    "\n",
    "# setup a graph for visualizing the root finding steps\n",
    "fig, ax = plt.subplots(1, 1, figsize=(12,4))\n",
    "\n",
    "ax.plot(x, f(x))\n",
    "ax.axhline(0, ls=':', color='k')\n",
    "\n",
    "# repeat Newton's method until convergence to the desired tolerance has been reached\n",
    "n = 0\n",
    "while f(xk) > tol:\n",
    "    xk_new = xk - f(xk) / fp(xk)\n",
    "\n",
    "    ax.plot([xk, xk], [0, f(xk)], color='k', ls=':')\n",
    "    ax.plot(xk, f(xk), 'ko')\n",
    "    ax.text(xk, -.5, r'$x_%d$' % n, ha='center')\n",
    "    ax.plot([xk, xk_new], [f(xk), 0], 'k-')\n",
    "\n",
    "    xk = xk_new\n",
    "    n += 1\n",
    "\n",
    "ax.plot(xk, f(xk), 'r*', markersize=15)\n",
    "ax.annotate(\"Root approximately at %.3f\" % xk,\n",
    "            fontsize=14, family=\"serif\",\n",
    "            xy=(xk, f(xk)), xycoords='data',\n",
    "            xytext=(-150, +50), textcoords='offset points', \n",
    "            arrowprops=dict(arrowstyle=\"->\", connectionstyle=\"arc3, rad=-.5\"))\n",
    "\n",
    "ax.set_title(\"Newton's method\")\n",
    "ax.set_xticks([-1, 0, 1, 2])\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-nonlinear-newton.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `scipy.optimize` functions for root-finding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAALAAAAATCAYAAAAwP4ceAAAABHNCSVQICAgIfAhkiAAABi1JREFUaIHt2XusHVUVBvDfbXtpoTSNWogUuLQB0dCaEjW0hdggGh88AxqVpEh9EYkkBoIiQSKmgkqJr0TlXSKEIEWwRFIfUa5RtGoV0wBB1BgjUB4tKBaRUqt/rD25c+fMnLPnnHsbTc6XnOwze9astedba++99hqGGOL/GDOnQecITsZH8Vq8DH+YBjt1mIPde8nW/4LdAjMF10/W3JsOf+S+717nZQzrsRZfxe04rMXzS3E/7sGhDTKrcDO+hO/gGryiQW4cf8cTuAEvb9A5Dxfj6cxxjmIL1lT6v47/NPzqdOfYPQHfxBVJ/z1YUSPXhvuf1IzvfTVyOf5oYzeX515yuTy38sdheNxkp34Ej+GgHgOGN4pgWy9mfR3eKlaJImBH8C08KF66wAn4Pk7Ccnw2DfquGp3H4zL8M8nk4PIku6bUNw9/xpW4sPLbimv7sHsKnsWBpb5V2IlXlfracH8sfoGrSr+1mF2Ry/FHG7vHy+O5l1wuz239YSMeNfllZ2IbbukyYFiIp0Qg7tMgMzMNqKprqXjRL6TrEXxOZ3rzYzzXZQz3yQvg43CnzgB+P15fIz9LzPa39GF3I35d078dH6vI5XJ/N45qsFcgxx9t7RbI5blJLpfnVv5YiD1iq6viVuxSv80XuCYN9swuMiuSzKdr7u0QTh3BDOxbI3MXftZF/7jexM7Dd/EanQHchHcIwmb1YXeDWIkOLvXNxYt4T7puw/0y/EukXheavIqXkeOPfn0+Li+Ac+UK9OK5Vm5G6lwpguf3NQ88LHLGYxsUzsbqNNgxbBZO+xMuMjG7F6f2hRodfxFkHS5IrcqMYZG8gOuGq3CpCIJcvFes2P0cRm4Uk3GT2K5HsE5MojuSTBvuTxLOOy3peQTXm5w+5PpjEJ9PB3J5niRXBPBYarfXPFAky4c3KHwD9hPb+8/FSrsQP8XnRf5a1n1IjY6dqT2g0j8D70y6HhGO6BdniBTm/hbPzBbBsqFPm5twHpbgAbGtbhbv9O8k04b7K8RhbEHS+yQ+iJtKz+T6YxCfTzVyee6QKwK42LJ31Tz0Ymr3b1C6MLXXC5LgbzhH5GEXiK17a9J/aslugdHUPl/pP0fkOi/h3cL587THQThLHAja4MRke7wPmwW+huvElrdSlLPGSvf74X5H0rsEvxOr0jHpXq4/BvH5VCOX5w65IpCKWTiqE03BVaBYSR6v9O/CD0UtcJlYLb4sttLLhUNn4WwcLba8Rys6rsa5OFKUVA7FBxrG0Q1fwfkiPWmDQdIH4v1uFDvHmChRHSNWxiIvHoT7HfhQ+r88tbn+GMTuVKOv9IGJAN6W2rqkfUFq/9ig9K8VuTIKEvdL7cX4pJhJW8XBbB9x8v0tnmmwsUfkb7tFMLfBefiRqCXPSb8iZxxN13UHh7niA0C/6QPxvqvEgetpcXD7hAjeS5PMINzDb0Spbk66zvXHoHanCrk818oVAbxZBEndqfbVYlbf16D4AVFvXFxzr5jJBal7RLlsmSgFnYL5Sa6jrlfBTuGox3rIVfEusZK/UPo9nO5dm64/VfPcqWLlvLelvartLSav/OvEtn9cuh6Ee+IgNmri61quPwa1O1XI5bmn3N3ikFPGDLGt31npH6tcXy3yrGrNcZM45XYrpG8XtdJen7UPEbnZEQ33x9WXbY4SB5ny7/QkuzZd1x0sN4pyVC802YVfifp1FRtEGlGgDfdVvCnJlUuPuf7ox+64qS2j5fLcU+5IMXNXl/o+LIgon0YvSgP7eKnvYLFFXlLqWypmzJsb7O0vAvchk79UzRdb/mdMHNjmis+h53YZ/5Y0rrqcropFuteB54tSW9PYc+2eKQ4dy0t9C0Q6U67R5nC/Umz7t5o4qC3GL3V+ms71R67Py8jlOUcul+dsfywR9ckvigPXBlH0L+Ns/EOc6ss4At8Wn4a/IWbwqgY7K0QOfJPOqsK++J44QGxLMlfidQ26VorS0B5B2HWi1NINi3QP4DUiALrtCrl234YfiKrAOsHP22vkenF/gJjEz4kJsF5M8lc2jC/XHzk+J/992/hjjd48d5Vr2tqnC6sFYbtxm/jUOcQQQwwxxBBDDDHEEHsT/wWNbwaiDN322gAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805601177$"
      ],
      "text/plain": [
       "0.6931471805601177"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.bisect(lambda x: np.exp(x) - 2, -2, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805599455$"
      ],
      "text/plain": [
       "0.6931471805599455"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.newton(lambda x: np.exp(x) - 2, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x_root_guess = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "f = lambda x: np.exp(x) - 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "fprime = lambda x: np.exp(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805599455$"
      ],
      "text/plain": [
       "0.6931471805599455"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.newton(f, x_root_guess)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805599453$"
      ],
      "text/plain": [
       "0.6931471805599453"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.newton(f, x_root_guess, fprime=fprime)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805599453$"
      ],
      "text/plain": [
       "0.6931471805599453"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.brentq(lambda x: np.exp(x) - 2, -2, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805599381$"
      ],
      "text/plain": [
       "0.6931471805599381"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.brenth(lambda x: np.exp(x) - 2, -2, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.6931471805590396$"
      ],
      "text/plain": [
       "0.6931471805590396"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.ridder(lambda x: np.exp(x) - 2, -2, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Multivariate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def f(x):\n",
    "    return [x[1] - x[0]**3 - 2 * x[0]**2 + 1, x[1] + x[0]**2 - 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.73205081, 0.46410162])"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fsolve(f, [1, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def f_jacobian(x):\n",
    "    return [[-3*x[0]**2-4*x[0], 1], [2*x[0], 1]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.73205081, 0.46410162])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fsolve(f, [1, 1], fprime=f_jacobian)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- 3 x^{2} - 4 x & 1\\\\2 x & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡     2         ⎤\n",
       "⎢- 3⋅x  - 4⋅x  1⎥\n",
       "⎢               ⎥\n",
       "⎣    2⋅x       1⎦"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x, y = sympy.symbols(\"x, y\")\n",
    "\n",
    "f_mat = sympy.Matrix([y - x**3 -2*x**2 + 1, y + x**2 - 1])\n",
    "f_mat.jacobian(sympy.Matrix([x, y]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAEYCAYAAABRMYxdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd4VGXexvHvk5BGIJRQQwihd0GNBVEp0lTAxqsiiB1317rqqrusrquytrXv6ooNFRQ7qFhAEVBQQkAlCYQektASagLpyfP+cUggJhBKJmcyc3+u61wzczJz5peh5M5TjbUWEREREV8S4HYBIiIiIjVNAUdERER8jgKOiIiI+BwFHBEREfE5CjgiIiLicxRwRERExOco4IiIiIjPUcARERERn6OAIyIiIj6nntsFHKpZs2Y2NjbW7TJERETESy1btmyHtbZ5dc/zqoATGxtLQkKC22WIiIiIlzLGbDqa56mLSkRERHyOAo6IiIj4HAUcERER8TleNQanKkVFRWRkZJCfn+92KX4vNDSU6OhogoKC3C5FRETkiLw+4GRkZNCwYUNiY2Mxxrhdjt+y1rJz504yMjJo37692+WIiIgcUY10URljWhljXjPGLD3k3LXGmJ+NMfMPHFcfz7Xz8/OJjIxUuHGZMYbIyEi1pImISJ1QUy04ZwOzgL6/O3+ltTb1RC+ucOMd9OcgIiJ1RY204FhrPwJyqvjSrcaYe4wxDxpjmtbEe4mIiIh3SkyEsWNh+3a3K/HsGJwFwGxrbZYx5gLgQ+C83z/JGDMRmAgQExPjwXJERETEU6yF226DpCTwhrkoHpsmbq3daK3NOvBwHjDAGBNYxfOmWGvjrLVxzZtXu/KyiIiIeKEPPoAFC2DyZGjqBX02Hgs4xpjHjDFlLUSdgY3W2hJPvV9dkZyczJQpU3jsscc8cv2lS5fywAMPMG7cuON6fWJiIiUlfv/HJCIix2D/frjnHjj5ZLjxRrercdTULKoBwNVAa2PM340xYcA24GVjzN+Avx34ut/r2bMn3bt3p1GjRsf0uuzsbMaOHUuHDh249tprsdZW+bxevXrxyCOPHFd335IlSzjzzDMpKio65teKiIj/euwxyMiAF1+EwEp9Ne6oqUHGC6y1N1hr21hrH7XW5llrn7fW3mSt/Ze1dqy19ueaeC9fcPrppxMfH1/l16ZMmVLl+Tlz5vDGG2+watUqli1bdtjXh4WFsXbtWiZOnHjMdZ1xxhmom1BERI7F+vXw1FMwfjz07+92NQd5/UJ/h7rzTvj115q9Zt++8NxzR37OwoULeeihh5g3bx7/+te/GDVqFL1796722rt27eKvf/0ro0aNYuXKlfTs2ZPi4mIaNmzIZZddVuVrFi9eXGU4GT16NMHBwQD06NGDyMjIKq+fl5fH/Pnzady4MTfddBPt2rWr/kMQERE5DtbC7bdDcDA88YTb1VRUpwKOW84991yioqJITU1l6NChtG7dGoC3336bd999t9Lz7777boYOHUrTpk2ZMGECjzzyCLNmzSIkJOS4aygLN/n5+URHR9OpUyeAKq8/ZsyY434fERGRozVzJnz5JTz7LERFuV1NRXUq4FTX0uJJgwcP5vvvvycmJoZmzZoBTriYMGHCEV8XExODtfaI4ea9997jrbfeApxBviNGjADg3nvvZfDgwRWe+/777/PPf/7zmK7/9ddf8/jjj1c6/8orr9C1a9cj1i8iIlKVffvgjjvgpJPg1lvdrqayOhVw3NS/f3/uuecenn766fJz1bXgACQkJFBQUEBOTg7BwcFVBpGxY8cyduxYAK699lqmTp1aZQ1ffvklF1xwAQ0aNGDTpk20a9fuqK4/YsSI8tAkIiJSEx55BNLTYcYMqOeFacJj08R9TefOnenYsSNdunQpPzdhwgS+/vrrSsfQoUNZu3Yt1157LWeddRb9+vXjpZdeOqEuqhkzZnDzzTczaNAgunfvzsyZM2v0+uCEsaysLObMmXNC1xEREd+WnAzPPAM33ABnneV2NVUzh5tu7Ia4uDibkJBQ4dyqVavo3r27SxUd9OOPP3LSSScRERHh0fe57777eMLbRmodwlv+PERExB3WwsCBzorFq1fDgVEbtcYYs8xaG1fd89SCU420tDTGjx9PmzZtPB5uAK8ONyIiIu+8AwsXOrOmajvcHAsv7DXzLjExMUybNs3tMkRERFy3e7ezYvGZZ8L117tdzZEp4IiIiMhR+dvfYOdOmDMHAry8D8jLyxMRERFvsGgR/O9/zo7hffu6XU31FHBERETkiAoK4KabICYGHn3U7WqOjrqoRERE5IgeewxWrXJWLW7QwO1qjo5acEREROSwkpPhX/+CcePg/PPdruboKeCIiIhIlUpLna6piAhnv6m6RF1UIiIiUqWXX4affoK334bmzd2u5tioBUdEREQqSU+H+++HYcNg/Hi3qzl2CjheaunSpTzwwAOMGzfuuF6fmJhISUlJDVclIiL+wFr405+cLqr//Q+McbuiY6eA46V69erFI488QkxMzDG/dsmSJZx55pkUFRV5oDIREfF1M2bAF184O4a3b+92NcdHAcdLhYWFsXbtWiZOnFjl16dMmXLY155xxhk0r2udpSIi4hW2boVbbnG2Y7jjDrerOX4KOEdh4cKFDB48GIB//etfJCYm1uj1d+3axc0338wXX3zBk08+yezZs/noo494/vnnef3119m0aVOl1yxevLhGaxAREbEWbr4Z8vJg6lQIDHS7ouNXp2ZR3fn1nfy67dcavWbfVn15bsRzR3zOueeeS1RUFKmpqQwdOpTWrVsD8Pbbb/Puu+9Wev7dd9/N0KFDj7qGpk2bMmHCBB555BFmzZpFSEgIAGPGjDmG70REROTETJsGn38OTz8NXbu6Xc2JqVMBx02DBw/m+++/JyYmhmYH9oefMGECEyZMOOLrvv76ax5//PFK51955RW6HvK3JyYmBmttebipynvvvcdbb70FOIOIR4wYAcC9995b3sIkIiJyPLZsgdtvh/7963bXVJk6FXCqa2nxpP79+3PPPffw9NNPl587mhacESNGlAeRI0lISKCgoICcnByCg4OrDDpjx45l7NixAFx77bVMnTr1OL8bERGRg6yFiROdPafefLNud02VqVMBx02dO3emY8eOdOnSpfzc0bTgVGft2rVMnjyZJ554gvj4eF566SXuu+++E7pmQkICWVlZzJkzh9GjR5/QtURExPe99RbMng3PPQedO7tdTc1QwDlKixcv5uGHH67x63bu3Lm8Jeaxxx476te1bNnysF+Li4tj//79J1qaiIj4gYwMp0vqnHPgttvcrqbmaBZVNdLS0hg/fjxt2rQhIiLC7XLKPfHEE26XICIidVxpKVx/PRQXO11TAT6UCtSCU42YmBimTZvmdhkiIiI17sUXYe5cZ7Xijh3drqZm+VBWExERkaOVmAj33QejRjkDjH2NAo6IiIifyc+HceOgUSN47bW6uddUddRFJSIi4mcmTXJacGbPhhYt3K7GM9SCIyIi4ke++w6eecbZLfyCC9yuxnPqRMCx1rpdgqA/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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#def f(x):\n",
    "#    return [x[1] - x[0]**3 - 2 * x[0]**2 + 1, x[1] + x[0]**2 - 1]\n",
    "\n",
    "x = np.linspace(-3, 2, 5000)\n",
    "y1 = x**3 + 2 * x**2 -1\n",
    "y2 = -x**2 + 1\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "\n",
    "ax.plot(x, y1, 'b', lw=1.5, label=r'$y = x^3 + 2x^2 - 1$')\n",
    "ax.plot(x, y2, 'g', lw=1.5, label=r'$y = -x^2 + 1$')\n",
    "\n",
    "x_guesses = [[-2, 2], [1, -1], [-2, -5]]\n",
    "for x_guess in x_guesses:\n",
    "    sol = optimize.fsolve(f, x_guess)\n",
    "    ax.plot(sol[0], sol[1], 'r*', markersize=15)\n",
    "\n",
    "    ax.plot(x_guess[0], x_guess[1], 'ko')\n",
    "    ax.annotate(\"\", xy=(sol[0], sol[1]), xytext=(x_guess[0], x_guess[1]),\n",
    "                arrowprops=dict(arrowstyle=\"->\", linewidth=2.5))\n",
    "    \n",
    "ax.legend(loc=0)\n",
    "ax.set_xlabel(r'$x$', fontsize=18)\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-nonlinear-system.pdf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.73205079, 0.46410162])"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.broyden2(f, x_guesses[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/rob/miniconda3/envs/py3.6/lib/python3.6/site-packages/scipy/optimize/minpack.py:162: RuntimeWarning: The iteration is not making good progress, as measured by the \n",
      "  improvement from the last ten iterations.\n",
      "  warnings.warn(msg, RuntimeWarning)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f(x):\n",
    "    return [x[1] - x[0]**3 - 2 * x[0]**2 + 1,\n",
    "            x[1] + x[0]**2 - 1]\n",
    "\n",
    "x = np.linspace(-3, 2, 5000)\n",
    "y1 = x**3 + 2 * x**2 -1\n",
    "y2 = -x**2 + 1\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "\n",
    "ax.plot(x, y1, 'k', lw=1.5, label=r'$y = x^3 + 2x^2 - 1$')\n",
    "ax.plot(x, y2, 'k', lw=1.5, label=r'$y = -x^2 + 1$')\n",
    "\n",
    "sol1 = optimize.fsolve(f, [-2,  2])\n",
    "sol2 = optimize.fsolve(f, [ 1, -1])\n",
    "sol3 = optimize.fsolve(f, [-2, -5])\n",
    "sols = [sol1, sol2, sol3]\n",
    "colors = ['r', 'b', 'g']\n",
    "for idx, s in enumerate(sols):\n",
    "    ax.plot(s[0], s[1], colors[idx]+'*', markersize=15)\n",
    "\n",
    "for m in np.linspace(-4, 3, 80):\n",
    "    for n in np.linspace(-15, 15, 40):\n",
    "        x_guess = [m, n]\n",
    "        sol = optimize.fsolve(f, x_guess)\n",
    "        idx = (abs(sols - sol)**2).sum(axis=1).argmin()\n",
    "        ax.plot(x_guess[0], x_guess[1], colors[idx]+'.')\n",
    "    \n",
    "ax.set_xlabel(r'$x$', fontsize=18)\n",
    "ax.set_xlim(-4, 3)\n",
    "ax.set_ylim(-15, 15)\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-nonlinear-system-map.pdf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f(x):\n",
    "    return [x[1] - x[0]**3 - 2 * x[0]**2 + 1,\n",
    "            x[1] + x[0]**2 - 1]\n",
    "\n",
    "x = np.linspace(-3, 2, 5000)\n",
    "y1 = x**3 + 2 * x**2 -1\n",
    "y2 = -x**2 + 1\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "\n",
    "ax.plot(x, y1, 'k', lw=1.5, label=r'$y = x^3 + 2x^2 - 1$')\n",
    "ax.plot(x, y2, 'k', lw=1.5, label=r'$y = -x^2 + 1$')\n",
    "\n",
    "sol1 = optimize.fsolve(f, [-2,  2])\n",
    "sol2 = optimize.fsolve(f, [ 1, -1])\n",
    "sol3 = optimize.fsolve(f, [-2, -5])\n",
    "\n",
    "for idx, s in enumerate([sol1, sol2, sol3]):\n",
    "    ax.plot(s[0], s[1], colors[idx]+'*', markersize=15)\n",
    "\n",
    "colors = ['r', 'b', 'g']\n",
    "for m in np.linspace(-4, 3, 80):\n",
    "    for n in np.linspace(-15, 15, 40):\n",
    "        x_guess = [m, n]\n",
    "        sol = optimize.fsolve(f, x_guess)\n",
    "\n",
    "        for idx, s in enumerate([sol1, sol2, sol3]):\n",
    "            if abs(s-sol).max() < 1e-8:\n",
    "                # ax.plot(sol[0], sol[1], colors[idx]+'*', markersize=15)\n",
    "                ax.plot(x_guess[0], x_guess[1], colors[idx]+'.')\n",
    "    \n",
    "ax.set_xlabel(r'$x$', fontsize=18)\n",
    "fig.tight_layout()\n",
    "fig.savefig('ch5-nonlinear-system-map.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Versions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%reload_ext version_information"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><tr><th>Software</th><th>Version</th></tr><tr><td>Python</td><td>3.6.8 64bit [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]</td></tr><tr><td>IPython</td><td>7.5.0</td></tr><tr><td>OS</td><td>Darwin 18.2.0 x86_64 i386 64bit</td></tr><tr><td>sympy</td><td>1.4</td></tr><tr><td>scipy</td><td>1.2.1</td></tr><tr><td>numpy</td><td>1.16.3</td></tr><tr><td>matplotlib</td><td>3.0.3</td></tr><tr><td colspan='2'>Mon May 06 14:34:33 2019 JST</td></tr></table>"
      ],
      "text/latex": [
       "\\begin{tabular}{|l|l|}\\hline\n",
       "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n",
       "Python & 3.6.8 64bit [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE\\_401/final)] \\\\ \\hline\n",
       "IPython & 7.5.0 \\\\ \\hline\n",
       "OS & Darwin 18.2.0 x86\\_64 i386 64bit \\\\ \\hline\n",
       "sympy & 1.4 \\\\ \\hline\n",
       "scipy & 1.2.1 \\\\ \\hline\n",
       "numpy & 1.16.3 \\\\ \\hline\n",
       "matplotlib & 3.0.3 \\\\ \\hline\n",
       "\\hline \\multicolumn{2}{|l|}{Mon May 06 14:34:33 2019 JST} \\\\ \\hline\n",
       "\\end{tabular}\n"
      ],
      "text/plain": [
       "Software versions\n",
       "Python 3.6.8 64bit [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]\n",
       "IPython 7.5.0\n",
       "OS Darwin 18.2.0 x86_64 i386 64bit\n",
       "sympy 1.4\n",
       "scipy 1.2.1\n",
       "numpy 1.16.3\n",
       "matplotlib 3.0.3\n",
       "Mon May 06 14:34:33 2019 JST"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%version_information sympy, scipy, numpy, matplotlib"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py3.6",
   "language": "python",
   "name": "py3.6"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
